package com.ecommerce.onion.domain.service;

import com.ecommerce.onion.domain.Order;
import com.ecommerce.onion.domain.Product;
import com.ecommerce.onion.domain.repository.OrderRepository;

import java.util.UUID;
/**
 * @packageName: domain（领域.服务包）
 * @className: DomainOrderService(领域订单服务)
 * @description: 实现订单服务
 * @author: luds
 * @version: v1.0
 * @date: 2021-03/25
 */
public class DomainOrderService implements OrderService {

    /**
     * 订单资料库
     */
    private final OrderRepository orderRepository;

    /**
     * 由订单资料库构建此领域订单服务
     * @param orderRepository 订单资料库
     */
    public DomainOrderService(final OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    /**
     * 由此产品创建订单，并返回订单ID
     * @param product 产品实例
     * @return 返回订单ID
     */
    @Override
    public UUID createOrder(final Product product) {
        //由UUID.randomUUID()、产品创建订单
        final Order order = new Order(UUID.randomUUID(), product);
        //调用资料库把创建的订单进行持久化
        orderRepository.save(order);
        //从订单返回ID
        return order.getId();
    }
    /**
     * 往此订单ID上追加产品
     * @param id 订单ID
     * @param product 产品实例
     */
    @Override
    public void addProduct(final UUID id, final Product product) {
        //由ID获取订单
        final Order order = getOrder(id);
        //往订单上追加产品
        order.addOrder(product);
        //调用资料库把加好的订单，并进行持久化
        orderRepository.save(order);
    }
    /**
     * 完成此ID的订单
     * @param id 订单ID
     */
    @Override
    public void completeOrder(final UUID id) {
        //由ID获取订单
        final Order order = getOrder(id);
        //并完成此订单
        order.complete();
        //调用资料库把完成的订单，进行持久化
        orderRepository.save(order);
    }
    /**
     * 从订单里删除此ID的产品
     * @param id 订单ID
     * @param productId 产品ID
     */
    @Override
    public void deleteProduct(final UUID id, final UUID productId) {
        //由ID获取订单
        final Order order = getOrder(id);
        //并从订单上移除为ID的产品
        order.removeOrder(productId);
        //调用资料库把移除的订单，进行持久化
        orderRepository.save(order);
    }

    /**
     * 由此ID获取订单
     * @param id 订单ID
     * @return 返回订单
     */
    private Order getOrder(UUID id) {
        //调用资料库，由ID查找；如果找到返回订单，否则抛出异常：此ID的订单不存在
        return orderRepository
          .findById(id)
          .orElseThrow(() -> new RuntimeException("Order with given id doesn't exist"));
    }
}
